package reflect;

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;

public class Test1 {
    public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException, InvocationTargetException, NoSuchMethodException {
        Class cls=Class.forName("reflect.Person");
        Object o = cls.newInstance();
        /**
         *  Method[]	getMethods()
         * 返回包含一个数组 方法对象反射由此表示的类或接口的所有公共方法 类对象，包括那些由类或接口和那些从超类和超接口继承的声明。
         *
         *  Method[]	getDeclaredMethods()
         * 返回包含一个数组 方法对象反射的类或接口的所有声明的方法，通过此表示 类对象，包括公共，保护，默认（包）访问和私有方法，
         * 但不包括继承的方法。
         */
        Method[] methods=cls.getDeclaredMethods();//本类除超类的方法

        for (Method m:methods) {
            if (m.getParameterCount()==0//判断无参
            && m.getModifiers()== Modifier.PUBLIC//判断是否为公开方法
            ){
                System.out.println("自动调用"+m.getName());
                m.invoke(o);
            }
        }

        for (Method m:methods) {
            if (m.getParameterCount()==0){
                System.out.println("自动调用"+m.getName());
                m.setAccessible(true);
                m.invoke(o);
            }
        }

    }
}
